package Docker

import (
	"bytes"
	"encoding/json"
	"fmt"
	"os/exec"
)

// ContainerStats 定义容器统计信息的结构体
type ContainerStats struct {
	BlockIO   string `json:"BlockIO"`   // 磁盘 I/O
	CPUPerc   string `json:"CPUPerc"`   // CPU 使用率
	Container string `json:"Container"` // 容器名称
	ID        string `json:"ID"`        // 容器 ID
	MemPerc   string `json:"MemPerc"`   // 内存使用率
	MemUsage  string `json:"MemUsage"`  // 内存使用情况
	Name      string `json:"Name"`      // 容器名称
	NetIO     string `json:"NetIO"`     // 网络 I/O
	PIDs      string `json:"PIDs"`      // 容器中的进程数量
}

//	GetContainerStats
//
// 描述信息： 获取容器的资源占用情况
//
// Param：
//
//	containerName ：容器名称
//
// Return：
//
//	*ContainerStats ：容器状态结构体指针
//	error ：错误信息
func GetContainerStats(containerName string) (*ContainerStats, error) {
	// 构造 docker stats 命令
	cmd := exec.Command("docker", "stats", containerName, "--no-stream", "--format", "{{json .}}")

	// 执行命令并获取输出
	var out bytes.Buffer
	cmd.Stdout = &out
	if err := cmd.Run(); err != nil {
		return nil, fmt.Errorf("failed to run docker stats command: %w", err)
	}

	// 解析输出为 JSON
	var stats ContainerStats
	if err := json.Unmarshal(out.Bytes(), &stats); err != nil {
		return nil, fmt.Errorf("failed to parse docker stats output: %w", err)
	}

	return &stats, nil
}

// StartContainer 根据容器名称启动容器
func StartContainer(containerName string) error {
	// 构造 docker start 命令
	cmd := exec.Command("docker", "start", containerName)

	// 执行命令并捕获输出
	var out bytes.Buffer
	cmd.Stdout = &out
	err := cmd.Run()
	if err != nil {
		return fmt.Errorf("failed to start container %s: %w", containerName, err)
	}

	fmt.Println(out.String()) // 打印 Docker 的输出
	return nil
}

// StopContainer 根据容器名称停止容器
func StopContainer(containerName string) error {
	// 构造 docker stop 命令
	cmd := exec.Command("docker", "stop", containerName)

	// 执行命令并捕获输出
	var out bytes.Buffer
	cmd.Stdout = &out
	err := cmd.Run()
	if err != nil {
		return fmt.Errorf("failed to stop container %s: %w", containerName, err)
	}

	fmt.Println(out.String()) // 打印 Docker 的输出
	return nil
}
